package service;

import controladoresJpa.RelacionamentoJpaController;
import controladoresJpa.exceptions.IllegalOrphanException;
import controladoresJpa.exceptions.NonexistentEntityException;
import controladoresJpa.exceptions.PreexistingEntityException;
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.Relacionamento;

/**
 * Modulo MER
 * Classe Service para construção de métodos de acesso ao Relacionamento
 * @author Eduardo, Maylon e Kamilla
 */
public class RelacionamentoService implements Serializable{

	private RelacionamentoJpaController jpa;

        public RelacionamentoService() {
            jpa = new RelacionamentoJpaController();
        }

        /**
         * Método responsável por salvar e atualizar um Atributo do Modelo Entidade-Relacionamento.
         * @param objeto atributo a ser salvo.
         * @throws NonexistentEntityException exceção NonexistentEntityException.
         * @throws Exception exceção.
         */
        public void salvar(Relacionamento objeto) {
            if(this.encontrado(objeto))
                try {
            jpa.edit(objeto);
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(RelacionamentoService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(RelacionamentoService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(RelacionamentoService.class.getName()).log(Level.SEVERE, null, ex);
        } 
                //TODO perguntar se ele realmente quer editar    
            else
                try {
            jpa.create(objeto);
        } catch (PreexistingEntityException ex) {
            Logger.getLogger(RelacionamentoService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(RelacionamentoService.class.getName()).log(Level.SEVERE, null, ex);
        }
        }

         /**
         * Método responsável por excluir um Atributo do Modelo Entidade-Relacionamento.
         * @param objeto atriubuto a ser excluido.
         * @throws NonexistentEntityException exceção NonexistentEntityException.
         */
        public void excluir(Relacionamento objeto)  {
            if(this.encontrado(objeto))
                try {
            jpa.destroy(objeto.getNome());
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(RelacionamentoService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(RelacionamentoService.class.getName()).log(Level.SEVERE, null, ex);
        } 
        }

        
        public List<Relacionamento> recarregar() {
            return jpa.findRelacionamentoEntities();
        }
        
        public boolean encontrado(Relacionamento objeto){
            List lst = jpa.findRelacionamentoEntities();
            Iterator i = lst.iterator();
            boolean achei = false;
            while(!achei && i.hasNext()){
                Relacionamento a = (Relacionamento) i.next();
                if(objeto.getNome().equals(a.getNome()))
                    return true;
            }
            return false;
        }

	/**
	 * M�todo que adiciona um atributo a uma entidade.
	 * @param atributo - atributo ao qual a entidade far� parte.
	 * @throws UniqueException -  exce��o de unicidade de atributos
	 */
	/*public void adicionar(AtributoMERService atributo) throws UniqueException{
		if(ConstrutoresMERVerification.isUnique(this.atributos, atributo))
			this.atributos.add(atributo);
		else{
			throw new UniqueException("Atributo n�o � unico nessa entidade");
		}
		
	}
	
	/**
	 * M�todo que desassocia um atributo de uma entidade.
	 * @param atributo - atributo que nao far� mais parte da entidade.
	 */
	/*public void remover(AtributoMERService atributo){
		this.atributos.remove(atributo);
	}*/
	
	

	
}
